package com.fr.report.script.function;

import com.fr.base.core.DateUtils;
import com.fr.report.script.Function;
import com.fr.report.script.Function.Type;
import com.fr.report.script.NormalFunction;
import com.fr.report.script.Primitive;
import java.util.Date;
import java.util.GregorianCalendar;

public class DATEDIF extends NormalFunction
{
  public Object run(Object[] paramArrayOfObject)
  {
    if (paramArrayOfObject.length < 3)
      return Primitive.ERROR_NAME;
    if (paramArrayOfObject[2] instanceof String)
    {
      Date localDate1 = null;
      if (paramArrayOfObject[0] instanceof Date)
        localDate1 = (Date)paramArrayOfObject[0];
      else
        localDate1 = DateUtils.object2Date(paramArrayOfObject[0], false);
      Date localDate2 = null;
      if (paramArrayOfObject[1] instanceof Date)
        localDate2 = (Date)paramArrayOfObject[1];
      else
        localDate2 = DateUtils.object2Date(paramArrayOfObject[1], false);
      int i = 0;
      GregorianCalendar localGregorianCalendar1 = new GregorianCalendar();
      localGregorianCalendar1.setTime(localDate1);
      GregorianCalendar localGregorianCalendar2 = new GregorianCalendar();
      localGregorianCalendar2.setTime(localDate2);
      if (paramArrayOfObject[2].equals("D"))
        i = Math.abs((int)((localDate1.getTime() - localDate2.getTime()) / 86400000.0D));
      if (paramArrayOfObject[2].equals("M"))
        if ((localGregorianCalendar1.get(1) == localGregorianCalendar2.get(1)) && (localGregorianCalendar1.get(2) == localGregorianCalendar2.get(2)))
          i = 0;
        else
          i = Math.abs(12 * (localGregorianCalendar1.get(1) - localGregorianCalendar2.get(1)) + localGregorianCalendar1.get(2) - localGregorianCalendar2.get(2)) - 1;
      if (paramArrayOfObject[2].equals("Y"))
        i = Math.abs(localGregorianCalendar1.get(1) - localGregorianCalendar2.get(1));
      if (paramArrayOfObject[2].equals("MD"))
        i = Math.abs(localGregorianCalendar1.get(5) - localGregorianCalendar2.get(5));
      if (paramArrayOfObject[2].equals("YM"))
        i = Math.abs(localGregorianCalendar1.get(2) - localGregorianCalendar2.get(2));
      if (paramArrayOfObject[2].equals("YD"))
        i = Math.abs(localGregorianCalendar1.get(6) - localGregorianCalendar2.get(6));
      return new Integer(i);
    }
    return Primitive.ERROR_NAME;
  }

  public Function.Type getType()
  {
    return Function.DATETIME;
  }

  public String getCN()
  {
    return "DATEDIF(start_date,end_date,unit):返回两个指定日期间的天数、月数或年数。\nStart_date:代表所指定时间段的初始日期。\nEnd_date:代表所指定时间段的终止日期。\nUnit:函数返回信息的类型。\n若unit=“Y”，则DATEDIF返回指定时间段的年差数。\n若unit=“M”，则DATEDIF返回指定时间段的月差数。\n若unit=“D”，则DATEDIF返回指定时间段的日差数。\n若unit=“MD”，则DATEDIF忽略年和月，返回指定时间段的日差数。\n若unit=“YM”，则DATEDIF忽略年和日，返回指定时间段的月差数。\n若unit=“YD”，则DATEDIF忽略年，返回指定时间段的日差数。\n示例:\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"Y\")等于3，即在2001年2月28日与2004年3月20日之间有3个整年。\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"M\")等于36，即在2001年2月28日与2004年3月20日之间有36个整月。\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"D\")等于1116，即在2001年2月28日与2004年3月20日之间有1116个整天。\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"MD\")等于8，即忽略月和年后，2001年2月28日与2004年3月20日的差为8天。\nDATEDIF(\"2001/1/28\",\"2004/3/20\",\"YM\")等于2，即忽略日和年后，2001年1月28日与2004年3月20日的差为2个月。\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"YD\")等于21，即忽略年后，2001年2月28日与2004年3月20日的差为21天。";
  }

  public String getEN()
  {
    return "DATEDIF(start_date,end_date,unit): Return number of day, or month, or year, between the two specified date.\nStart_date is the start date.\nEnd_date is the end date.\nUnit specifys the type of the return value.\nIf unit=\"Y\", then DATEIF returns number of year between the two date.\nIf unit=\"M\", then DATEIF returns number of month between the two date.\nIf unit=\"D\", then DATEIF returns number of day between the two date.\nIf unit=\"MD\", then DATEIF returns number of day between the two date, year and month are ignored.\nIf unit=\"YM\", then DATEIF returns number of month between the two date, year and day are ignored.\nIf unit=\"YD\", then DATEIF returns number of day between the two date, year is ignored.\n\nExample:\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"Y\") = 3 (years)\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"M\") = 36 (month)\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"D\") = 1116 (days)\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"MD\") = 8 (days), year and month are ignored.\nDATEDIF(\"2001/1/28\",\"2004/3/20\",\"YM\") = 2 (month), year and day are ignored.\nDATEDIF(\"2001/2/28\",\"2004/3/20\",\"YD\") = 21 (days), year is ignored.";
  }
}